package servicios

import aerolinea.Asiento
import aerolinea.Tramo
import daos.Operation
import daos.SessionManager
import daos.TramoDAO
import dominio.Usuario
import excepciones.AsientoYaEstaReservado
import java.util.Date
import java.util.List

class TramoManager {
	
	def consultarTramo(String ido, String idd) {
		SessionManager.runInSession(new ConsultarTramo(ido, idd))	
	}
	
	def asientosDisponibles(String ido, String idd) {
		SessionManager.runInSession(new AsientosDisponibles(ido, idd))
		/*var s= 	SessionManager.getSession().sessionFactory.openSession
		var q = s.createQuery("FROM Asiento a WHERE (not a.reservado) and "+ido
			+ " = a.tramo.idTramo.origenID and "+idd+ " = a.tramo.idTramo.destinoID")
		q.list*/
	}
	
	def crearTramo(String origen, String destino, Date llegada, Date salida,
		int precioBase, List<Asiento> asientos){

		SessionManager.runInSession(new CrearTramo(origen, destino, llegada, salida, precioBase, asientos))
	}

	def modificarTramo(String origen, String destino, Date llegada, Date salida,
		int precioBase, List<Asiento> asientos) {
		SessionManager.runInSession(new ModificarTramo(origen, destino, llegada, salida,precioBase, asientos))
	}
	
	def reservarAsientos(Usuario usuario, Tramo tramo, List<Asiento> asientos){
		var asientosDisp= asientosDisponibles(tramo.idTramo.origenID, tramo.idTramo.destinoID)
		if(! asientosDisp.containsAll(asientos)) throw new AsientoYaEstaReservado
		SessionManager.runInSession(new ReservarAsientos(usuario, tramo, asientos))
	}
}

class ConsultarTramo implements Operation<Tramo>{
	var String origen
	var String destino
	
	new(String ori, String des) {
		origen= ori
		destino= des
	}

	override Tramo execute() {
		var a = new TramoDAO().get(origen, destino)
		a
	}
}

class AsientosDisponibles implements Operation<List<Asiento>>{
	var String origen
	var String destino
	
	new(String ido, String idd) {
		origen= ido
		destino= idd
	}

	override List<Asiento> execute() {
		var s= 	SessionManager.getSession()
		var q = s.createQuery("SELECT asiento FROM Tramo as tramo JOIN tramo.asientos as asiento WHERE asiento.reservado = " + false + " AND tramo.idTramo = ('"+origen+"','"+destino+"')")
		q.list
	}
}


class CrearTramo implements Operation<Tramo> {
	var String origen
	var String destino
	var Date horaSalida
	var Date horaLlegada
	var int precioBase
	var List<Asiento> asientos
	

	new(String ori, String dest, Date salida, Date llegada, int precio, List<Asiento> asie) {
		origen= ori
		destino= dest
		horaSalida= salida
		horaLlegada= llegada
		precioBase= precio
		asientos= asie
	}

	override Tramo execute() {
		var a = new Tramo(origen, destino, horaSalida, horaLlegada, precioBase, asientos)
		new TramoDAO().save(a)
	    a
	}
}

class ModificarTramo implements Operation<Tramo> {

	var String origen
	var String destino
	var Date horaSalida
	var Date horaLlegada
	var int precioBase
	var List<Asiento> asientos
	

	new(String ori, String dest, Date salida, Date llegada, int precio, List<Asiento> asie) {
		origen= ori
		destino= dest
		horaSalida= salida
		horaLlegada= llegada
		precioBase= precio
		asientos= asie
	}

	override Tramo execute() {
		var a = new TramoDAO().get(origen, destino)
		a.setHoraSalida(horaSalida)
		a.setHoraLlegada(horaLlegada)
		a.setPrecioBase(precioBase)
		a.setAsientos(asientos)
		a
	}
}

class ReservarAsientos implements Operation<List<Asiento>> {

	var Usuario usuario
	var Tramo tramo
	var List<Asiento> asientos

	new(Usuario u, Tramo t, List<Asiento> a){
		usuario= u
		tramo= t
		asientos= a
	}

	override List<Asiento> execute() {
		new TramoDAO().update(usuario, tramo, asientos)
		asientos
	}

}